package com.wangyadong.hobby.schedule.jobtask.jvm.MH;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;

/**
 * <p>
 *
 * @author <714037465@qq.com>
 * @since 2018/11/2611:07
 **/
public class MHtest {

    public String toWString(String s) {
        String s1 = "hello->>>" + s + "MethodHandle";
        return s1;
    }

    public static void main(String[] args) throws Throwable {
        MHtest mHtest = new MHtest();
        MethodHandle mh = getToStringMH();
        //mHtest 要调用的类,如果没有返回值，则只能找到方法类型为void的
        String s = (String) mh.invokeExact(mHtest, "ww");
        System.out.println(s);
        //MHtest.class 则不可以 Cannot cast java.lang.Class to com.wangyadong.hobby.schedule.jobtask.jvm.MH.MHtest
        mh = mh.bindTo(mHtest);
        String wangyadong = (String) mh.invokeWithArguments("wangyadong");
        System.out.println(wangyadong);
        System.out.println("=-===========================");
        System.out.println(MHtest.class);
        System.out.println(mHtest.getClass());
        System.out.println(MethodHandles.lookup().lookupClass());
    }


    public static MethodHandle getToStringMH() {
        //首先构造 方法返回值和参数列表
        MethodType methodType = MethodType.methodType(String.class, String.class);
        MethodHandle methodHandle = null;
        try {
            //在创建要调用的类，包括：1首先找到要加载的类，然后选在调用的方式（参数为类名，方法名，返回值，参数类型）从而得到一个句柄
            methodHandle = MethodHandles.lookup().findVirtual(MHtest.class, "toWString", methodType);
        } catch (NoSuchMethodException | IllegalAccessException e) {
            e.printStackTrace();
        }
        return methodHandle;
    }
}
